home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / COBOL / 3291.ZIP / COBOL65.ZIP / ASMSRC.ZIP / WINDOWS.ASM < prev   
Assembly Source File  |  1990-09-05  |  23KB  |  585 lines

  1.  
  2.  
  3.  
  4. NAME        WINDOWS
  5. .RADIX 16
  6. ;****************************************************************************
  7. ;*                                                                          *
  8. ;*                     READ ME NOW !!!!!!!!!!!!!!!                          *
  9. ;*                     ---------------------------                          *
  10. ;*                                                                          *
  11. ;*  TWO METHODES OF ACCESSING DATA ARE SHOWN HERE.  THE FIRST IS IN THE     *
  12. ;*  WINDOW ROUTINE, THAT MAKES USE OF THE DGROUP AREA OF THE MAIN PROGRAM   *
  13. ;*  TO STORE AND RETREIVE DATA.                                             *
  14. ;*                                                                          *
  15. ;*  THE SECOND METHOD SHOWN IN SAVRST ROUTINE MAKES USE OF A DATA AREA      *
  16. ;*  INSIDE THE SAVEREST SEGMENT EITHER METHOD WORKS, IF YOU ADHERE TO       *
  17. ;*  THE RULES OF COMMON SENSE.                                              *
  18. ;*                                                                          *
  19. ;*  I HOPE THE EXAMPLES GIVEN WILL AID YOU IN WRITTING YOUR OWN ROUTINES    *
  20. ;*  IN ASMB TO INTERFACE WITH THE COBOL 6.05 GENERATED PROGRAMS             *
  21. ;*                                                                          *
  22. ;*                                                                          *
  23. ;*                                                                          *
  24. ;* NOTE: WHEN PASSING DATA TO YOUR ASMB ROUTINES. 6.05 STORES CHAR. ON THE  *
  25. ;*       STACK STARTING AT OFFSET BP+6, AND INTEGERS ARE STORED STARTING    *
  26. ;*       AT OFFSET BP+6.  THIS IS BECAUSE, THE CHAR ADDRESS POINTED TO BY   *
  27. ;*       THE VALUE IN BP+6 IS AN ADDRESS, THAT POINTS TO THE 4 BYTE VALUE   *
  28. ;*       TO THE START OF THE STRING. IN THE CASE OF INTEGERS BEING PASSED   *
  29. ;*       THE THE OFFSET OF BP+6 IS A AN ADDRESS THAT POINTES TO A 4 BYTE    *
  30. ;*       INTEGER WITH THE HIGH ORDER BYTES HOLDING THE LOWORDER INTEGER     *
  31. ;*       VALUE AS IN 1000 HEX IS REALLY 16 DEC.
  32. ;*                                                                          *
  33. ;*       IF I HAVE NOT TOTALLY CONFUSED YOU BY NOW THEN YOUR DOING OK AND   *
  34. ;*       SHOULD HAVE NO PROBLEM IN INTERFACING YOUR ROUTINES TO 6.05        *
  35. ;*                                                                          *
  36. ;****************************************************************************
  37.  
  38.  
  39.  
  40.  
  41.  
  42. ;****************************************************
  43. ;*                                                  *
  44. ;* DATA ADDRESS IS STORED ON THE STACK STARTING AT  *
  45. ;* OFFSET 6 AND INC BY TWO FOR EACH PARM PASSED.    *
  46. ;* PARMS ARE PASSED FROM LAST TO FIRST              *
  47. ;*                                                  *
  48. ;****************************************************
  49.  
  50.  
  51. FIRST_PARM        EQU    10H
  52. SECOND_PARM        EQU    0EH
  53. THIRD_PARM        EQU    0CH
  54. FOURTH_PARM        EQU    0AH
  55. FIFTH_PARM        EQU    08H
  56. SIXTH_PARM              EQU     06H
  57. CHAR_PARM        EQU    06H
  58.  
  59. ;****************************************************
  60. ;*                                                  *
  61. ;* OTHER EQUATES THAT ARE SELF EXCLAIMITORY         *
  62. ;*                                                  *
  63. ;****************************************************
  64.  
  65. SAVE            EQU    'S'
  66. RESTORE            EQU    'R'
  67. MONO_DISPLAY_ADDRESS    EQU    0B000H
  68. COLOR_DISPLAY_ADDRESS    EQU    0B800H
  69. BYTES_IN_VIDEO_MEMORY    EQU    07D0H
  70.  
  71.  
  72. ;******************************************
  73. ;VIDEO DISPLAY MODES RETURNED BY VID BIOS * 
  74. ;FUNCTION 00                              *
  75. ;******************************************
  76.  
  77. DISPLAY_0        EQU    0
  78. DISPLAY_1        EQU    1
  79. DISPLAY_2        EQU    2
  80. DISPLAY_3        EQU    3
  81. DISPLAY_4        EQU    4
  82. DISPLAY_5        EQU    5
  83. DISPLAY_6        EQU    6
  84. DISPLAY_7        EQU    7
  85. DISPLAY_8        EQU    8
  86. DISPLAY_9        EQU    9
  87. DISPLAY_10        EQU    0AH
  88.  
  89.  
  90. ;
  91. ;
  92. ; THE EQUATES USED BY THIS ROUTINE
  93. ;
  94.  
  95. TOP_LEFT_CORNER        EQU    0C9H    ; ╔
  96. HORIZONTAL_BAR        EQU    0CDH    ; ═
  97. TOP_RIGHT_CORNER    EQU    0BBH    ; ╗
  98. VERTICAL_BAR        EQU    0BAH    ; ║
  99. BOTTOM_LEFT        EQU    0C8H    ; ╚
  100. BOTTOM_RIGHT        EQU    0BCH    ; ╝
  101. SPACE            EQU    020H    ; SPACE
  102.  
  103.  
  104. ;****************************************************
  105. ;*                                                  *
  106. ;* DON'T CHANGE THE LOAD ORDER OF THE SEGMENTS OR   *
  107. ;* THE GROUPS.  COBOL VERSION 6.05 REQUIRES THEM    *
  108. ;* TO BE IN THIS ORDER!!!!                          *
  109. ;*                                                  *
  110. ;****************************************************
  111.  
  112. WINDOWS        SEGMENT   PARA 
  113. DGROUP        GROUP     DSEG,IDATA,SSEG,ZZMSEG
  114. EGROUP        GROUP     ESEG
  115.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  116. WINDOWS        ENDS
  117.  
  118. OVERLAY_AREA    SEGMENT    PARA PUBLIC 'CODE'
  119. OVERLAY_AREA    ENDS
  120.  
  121. DSEG        SEGMENT    PARA 
  122. DSEG        ENDS
  123.  
  124. IDATA        SEGMENT COMMON PARA 'DATA'
  125. IDATA        ENDS
  126.  
  127. SSEG        SEGMENT     STACK PARA 'STACK'
  128. SSEG        ENDS
  129.  
  130. ZZMSEG        SEGMENT MEMORY word 'MEMORY'
  131. ZZMSEG        ENDS
  132.  
  133. ESEG        SEGMENT COMMON BYTE 'CCODE'
  134. ESEG        ENDS
  135.  
  136. ;****************************************************************************
  137. ;*                                                                          *
  138. ;*  CALLED FROM 6.05 AS:                                                    *
  139. ;*  working-storage section.                          literal               *
  140. ;*  01  WINDOW-DISCRIPTION.                       ______|________           *
  141. ;*      03  ROW               PIC 99 COMP-0 VALUE |  0 THROUGH 20 |.        *
  142. ;*      03  column            pic 99 comp-0 value    0 through 72           *
  143. ;*      03  width-of-box      pic 99 comp-0 value    7 through 80           *
  144. ;*      03  height-of-box     pic 99 comp-0 value    6 through 20           *
  145. ;*      03  attribute         pic 999 comp-0 value   0 through 255          *
  146. ;*      03  SOUND             PIC 9 COMP-0 VALUE 0=OFF 1=ON                 *
  147. ;*                                                                          *
  148. ;*  call 'window' using row column width-of-box height-of-box attribute .   *
  149. ;*                                                                          *
  150. ;*                                                                          *
  151. ;****************************************************************************
  152.  
  153.  
  154.  
  155. WINDOWS        SEGMENT   PARA 
  156. DGROUP        GROUP     DSEG,IDATA,SSEG,ZZMSEG
  157. EGROUP        GROUP     ESEG
  158.         PUBLIC      WINDOW
  159.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  160. WINDOW        PROC    FAR                                    
  161.         PUSH    BP        ;SAVE THE ENTRY POINT
  162.         MOV    BP,SP                                  
  163.         PUSH    SI
  164.         push    DI
  165.         push    SP
  166.         push    AX
  167.         push    BX
  168.         push    CX
  169.         PUSH    DS                                     
  170.         PUSH    ES                                     
  171.         PUSH    SS                                     
  172.         PUSH    DX                                     
  173.         MOV    AH,0FH                ;GET CURRENT VIDEO MODE
  174.         INT    10                ;THRU BIOS CALL
  175.         CMP    AL,DISPLAY_2            ;SEE IF IT IS CGA IN MONO MODE
  176.         JZ    VALID_MODE            ;YES
  177.         CMP    AL,DISPLAY_3            ;SEE IF IT IS CGA IN COLOR MODE
  178.         JZ    VALID_MODE            ;YES
  179.         MOV    WORD PTR [VIDEO_ADDRESS],0B000H    ;MAYBE ITS MONO
  180.         CMP    AL,DISPLAY_7                    ;CHECK AND SEE
  181.         JZ    VALID_MODE            ;YES
  182.         JMP    EXIT                ;NOPE EXIT THIS
  183. VALID_MODE:    MOV    BYTE PTR [CURRENT_VID_MODE],AL    ;SAVE CURRENT MODE
  184.         MOV    BX,WORD PTR [BP+FIRST_PARM]    ;GET 1 PARM ADDRESS
  185.         MOV    AX,WORD PTR [BX]        ;LOAD AX WITH PARM VALUE
  186.         XCHG    AH,AL                ;XCHANGE AH,AL  
  187.         MOV    BYTE PTR [ROW_POINTER],AL    ;SAVE ROW       
  188.         CMP    AL,14                ;COMPARE TO 20 ?
  189.         JB    VALID_ROW            ;VALID ROW     
  190.         JMP    EXIT                ;EXIT         
  191. VALID_ROW:    MOV    BX,WORD PTR [BP+SECOND_PARM]    ;GET COLUMN
  192.         MOV    AX,[BX]                         ;LOAD THE AX WITH PARM VALUE
  193.         XCHG    AH,AL                ;MOVE'M ROUND
  194.         MOV    BYTE PTR [COLUMN_POINTER],AL    ;SAVE COLUMN
  195.         CMP    AL,48                ;IS COLUMN VALID
  196.         JB    VALID_COLUMN            ;YES            
  197.         JMP    EXIT                ;NO EXIT        
  198. VALID_COLUMN:    MOV    BX,WORD PTR [BP+THIRD_PARM]    ;GET WIDTH       
  199.         MOV    AX,[BX]                ;LOAD AX WITH PARM
  200.         XCHG    AH,AL                ;MOVE'M ROUND
  201.         MOV    BYTE PTR [WIDTH_POINTER],AL    ;SAVE WIDTH      
  202.         CMP    AL,07                ;SEE IF VALID       
  203.         JA    VALID_WIDTH            ;YES           
  204.         JMP    EXIT                ;NO            
  205. VALID_WIDTH:    MOV    BX,WORD PTR [BP+FOURTH_PARM]    ;GET HEIGHT   
  206.         MOV    AX,[BX]                ;LOAD AX WITH PARM
  207.         XCHG    AH,AL                ;MOVE'M ROUND
  208.         MOV    BYTE PTR [HEIGHT_POINTER],AL    ;SAVE HEIGHT    
  209.         CMP    AL,05                ;SEE IF VALID
  210.         JA    VALID_HEIGHT            ;YES              
  211.         JMP    EXIT                ;NO EXIT          
  212. VALID_HEIGHT:    MOV    BX,WORD PTR [BP+FIFTH_PARM]    ;GET ATRIBUTE     
  213.         MOV    AX,[BX]                ;LOAD AX WITH PARM
  214.         XCHG    AH,AL                ;MOVE'M ROUND
  215.         MOV    BYTE PTR [ATRIBUTE_POINTER],AL    ;SAVE ATRIBUTE
  216. SOUND_ON_OFF:   MOV    BX,WORD PTR [BP+SIXTH_PARM]     ;GET SOUND CONTROL
  217.         MOV    AX,[BX]                ;INTO AX
  218.         XCHG    AH,AL
  219.         MOV    BYTE PTR [SOUND_CONTROL],AL    ;PLACE TO PUT IT
  220.         MOV    WORD PTR [DURATION],0500H                   
  221.         MOV    AL,BYTE PTR [WIDTH_POINTER]    ;LOAD AL WITH WIDTH
  222.         SHR    AL,1                ;DIVIDE BY 2
  223.         ADD    AL,BYTE PTR [COLUMN_POINTER]    ;ADD COL +(WIDTH/2) TO GET CENTER
  224.         SUB    AL,02                ;SUBTRACT 2 FOR STARTING POINT
  225.         MOV    BYTE PTR [INCRM_COL_PNTR],AL    ;SAVE STARTING PLACE
  226.         MOV    AL,BYTE PTR [HEIGHT_POINTER]    ;GET TOTAL HEIGHT
  227.         SHR    AL,1                ;DIVIDE BY 2
  228.         ADD    AL,BYTE PTR [ROW_POINTER]    ;ADD ROW +(HEIGHT/2)
  229.         DEC    AL                ;SUBTRACT 1 FOR STARTING POINT
  230.         MOV    [INCRM_ROW_PNTR],AL             ;MOVE BACK 
  231.         MOV    BYTE PTR [WRITE_CHAR_X_TIMES],06
  232.         MOV    BYTE PTR [BYTES_MOVED],04
  233. DO_IT_AGAIN_SAM: CMP    BYTE PTR [CURRENT_VID_MODE],07
  234.         JZ    RETRACE_OK
  235.         CALL    CHECK_RETRACE                                  
  236. RETRACE_OK:    CALL    MAKE_BOX                                  
  237.         CMP    BYTE PTR [CURRENT_VID_MODE],07                     
  238.         JZ    VID_CNT_OK                                  
  239.         CALL    PRG_VIA_MODE                                  
  240. VID_CNT_OK:    CMP    BYTE PTR [SOUND_CONTROL],0
  241.         JZ    NO_SOUND
  242.         CALL    MAKE_SOUND                                  
  243.         SUB    BYTE PTR [TONE],04                     
  244. NO_SOUND:    MOV    AL,[COLUMN_POINTER]                              
  245.         CMP    AL,[INCRM_COL_PNTR]                              
  246.         JZ    COL_EQU_TEMP                                  
  247.         ADD    BYTE PTR [WRITE_CHAR_X_TIMES],02                     
  248.         DEC    BYTE PTR [INCRM_COL_PNTR]                        
  249. COL_EQU_TEMP:    MOV    AL,[INCRM_ROW_PNTR]                              
  250.         CMP    AL,[ROW_POINTER]                              
  251.         JZ    ROW_EQU_TEMP                                  
  252.         ADD    BYTE PTR [BYTES_MOVED],02                     
  253.         DEC    BYTE PTR [INCRM_ROW_PNTR]                        
  254.         JMP    DO_IT_AGAIN_SAM                                  
  255. ROW_EQU_TEMP:    NOP                                           
  256.         MOV    AL,[COLUMN_POINTER]                              
  257.         CMP    AL,[INCRM_COL_PNTR]                              
  258.         JNZ    DO_IT_AGAIN_SAM                                  
  259.         MOV    AL,[INCRM_ROW_PNTR]                              
  260.         CMP    AL,[ROW_POINTER]                              
  261.         JNZ    DO_IT_AGAIN_SAM                                  
  262. EXIT:        POP    DX                                     
  263.         POP    SS                                     
  264.         POP    ES                                     
  265.         POP    DS                                     
  266.         POP      CX
  267.         POP    BX
  268.         POP     AX
  269.         POP    SP
  270.         POP    DI
  271.         POP    SI
  272.         POP    BP                                     
  273.         RET    0CH    ;CLEAN STACK 2 BYTES PER PARM TOTAL IS 12 HERE
  274.  
  275. WINDOW      ENDP                                              
  276.                                                             
  277. GET_ABS_VID_ADR    PROC    NEAR                                      
  278.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  279.         MOV    AL,0A0H            ;MOVE 160 TO AL. 160 IS SAME COLUMN DIFF ROW
  280.         MUL    DH            ;MULTPY ROW TO GET NEW ROW ADDRESS VALUE IS IN AX
  281.         SHL    DL,1            ;MULTPY COL * 10
  282.         XOR    DH,DH            ;ZERO DH OUT
  283.         ADD    AX,DX            ;ADD ABS ADDRESS OF ROW + COLUMN
  284.         MOV    DI,AX            ;STORE DIST REG WITH ADDRESS
  285.         MOV    AX,01000H        ;MOV 4097 TO AX
  286.         MUL    BX            ;MULT BY 0
  287.         ADD    DI,AX            ;ADD TO DIST ADDR
  288.         RET
  289. GET_ABS_VID_ADR ENDP                                              
  290.                                                             
  291. CHECK_RETRACE    PROC    NEAR               
  292.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  293.         MOV    DX,03DAH        ;VIDEO CONTROLER PORT
  294. NOT_READY:    IN    AL,DX            ;INPORT TO AL
  295.         TEST    AL,08            ;SEE IF IN RETRACE MODE
  296.         JZ    NOT_READY        ;YES LOOP BACK
  297.         SUB    DX,+02            ;NOPE. SET PORT TO 03DC
  298.         MOV    AL,25            ;PREP TO PROG DISP TO TURN OFF RETRACE
  299.         OUT    DX,AL            ;PROGRAM DISPLY CONTROLER
  300.         RET                ;WERE DONE HERE
  301. CHECK_RETRACE    ENDP                                              
  302.                                                             
  303. PRG_VIA_MODE    PROC    NEAR               
  304.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  305.         MOV    AL,[CURRENT_VID_MODE]    ;LOAD AL WITH VIDEO MODE
  306.         LEA    BX,[VID_TABLE]        ;LOAD VID_TABLE IN BX
  307.         XLATB                ;TRANSLATE TO REFLETE VID MODE
  308.         MOV    DX,03D8H        ;LOAD DX WITH PORT OF VID CONTROLER
  309.         OUT    DX,AL            ;AND PROGRAM IT
  310.         RET                ;WERE DONE HERE
  311. PRG_VIA_MODE    ENDP                                              
  312.                                                             
  313. MAKE_SOUND    PROC     NEAR               
  314.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  315.         MOV    AL,0B6H                                  
  316.         OUT    43,AL                                  
  317.         MOV    AL,[TONE]                              
  318.         OUT    42,AL                                  
  319.         MOV    AL,00                                  
  320.         OUT    42,AL                                  
  321.         IN    AL,61                                  
  322.         OR    AL,03                                  
  323.         OUT    61,AL                                  
  324.         MOV    CX,[DURATION]                              
  325. WAIT_UNTIL:        LOOP    WAIT_UNTIL                                  
  326.         IN    AL,61                                  
  327.         AND    AL,0FCH                                  
  328.         OUT    61,AL                                  
  329.         RET                                           
  330. MAKE_SOUND    ENDP                                              
  331.                                                             
  332. MAKE_BOX    PROC  NEAR               
  333.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  334.         MOV    DH,[INCRM_ROW_PNTR]    ;LOAD DH WITH TEMP ROW
  335.         MOV    DL,[INCRM_COL_PNTR]    ;LOAD DL WITH TEMP COL
  336.         MOV    ES,[VIDEO_ADDRESS]    ;LOAD ES SEG WITH VID ADDRESS
  337.         CLD                ;CLEAR DIRECTION FLAG
  338.         MOV    BL,[DBUG_POINT]        ;MOVE 0 TO THE BL
  339.         XOR    BH,BH            ;ZERO OUT THE BH
  340.         CALL    GET_ABS_VID_ADR        ;GET ABS ADDR STORE IN DI REG 
  341.         MOV    AL,TOP_LEFT_CORNER    ;LOAD AL WITH ╔
  342.         MOV    AH,[ATRIBUTE_POINTER]    ;AND THE ATRIBUTE SO AX HOLDS BOTH
  343.         STOSW                ;MOVE IT TO THE ES:DI 'ABS ADDR OF VID SCREEN'
  344.         MOV    CL,[WRITE_CHAR_X_TIMES] ;LOAD THE CX REG WITH NUMBER OF
  345.         MOV    CH,00            ;TIMES TO WRITE THE BAR
  346.         MOV    AL,HORIZONTAL_BAR    ;LOAD AL WITH ═
  347.         REPZ    STOSW            ;MOVE IT UNTIL CX=0
  348.         MOV    AL,TOP_RIGHT_CORNER    ;LOAD AL WITH ╗
  349.         STOSW                ;STORE IT ES:DI
  350.         MOV    AL,[WRITE_CHAR_X_TIMES]    ;LOAD AL 
  351.         SHL    AL,1            ;MULTIPLY BY 10    
  352.         SUB    AH,AH            ;ZERO OUT AH
  353.         ADD    DI,009CH        ;ADD 156 FOR NEW POSITION
  354.         SUB    DI,AX            ;SUBTRACT LAST PLACE
  355.         MOV    CL,[BYTES_MOVED]    ;MOVE BYTES_MOVED TO CL
  356.         MOV    CH,00            ;AND 0 TO CH
  357. DRAW_VERT_BARS:    PUSH    CX            ;SAVE CX FOR USE LATER
  358.         MOV    AL,VERTICAL_BAR        ;LOAD AL WITH ║
  359.         MOV    AH,[ATRIBUTE_POINTER]    ;AND THE ATRIBUTE
  360.         STOSW                ;STORE IT ES:DI    
  361.         MOV    AL,SPACE        ;MOVE A SPACE INTO AL
  362.         MOV    AH,[ATRIBUTE_POINTER]    ;AND THE ATRIBUTE
  363.         MOV    CL,[WRITE_CHAR_X_TIMES]    ;AND THE NUMBER OF TIMES TO WRITE IT
  364.         MOV    CH,00            ;CH ALWAYS 0
  365.         REPZ    STOSW            ;NOW WRITE IT UNTIL CX=0
  366.         MOV    AL,VERTICAL_BAR        ;LOAD AL WITH ║
  367.         MOV    AH,[ATRIBUTE_POINTER]    ;AND THE ATRIBUTE
  368.         STOSW                ;AND WRITE IT
  369.         MOV    AL,[WRITE_CHAR_X_TIMES]    ;LOAD AL
  370.         SHL    AL,1            ;MULTI BY 10
  371.         SUB    AH,AH            ;ZERO OUT AH
  372.         ADD    DI,009CH        ;ADD 156 TO DISTINATION REG
  373.         SUB    DI,AX            ;SUBTRACT WHAT WE ALREADY DID
  374.         POP    CX            ;GET BACK BYTES MOVED
  375.         LOOP    DRAW_VERT_BARS                                  
  376.         MOV    AL,BOTTOM_LEFT        ;LOAD AL WITH ╚
  377.         MOV    AH,[ATRIBUTE_POINTER]    ;AND WITH THE ATRIBUTE
  378.         STOSW                ;WRITE IT TO ES:DI
  379.         MOV    CL,[WRITE_CHAR_X_TIMES]    ;THIS MANY TIMES WE WILL WRITE
  380.         MOV    CH,00            ;
  381.         MOV    AL,HORIZONTAL_BAR    ;THE HORIZONTAL BAR 
  382.         REPZ    STOSW            ;NOW WRITE IT
  383.         MOV    AL,BOTTOM_RIGHT        ;AND THE BOTTOM RIGHT CORNER
  384.         STOSW                ;AND WRITE IT
  385.         RET                ;WE ARE DONE HERE
  386. MAKE_BOX    ENDP  
  387.  
  388.  
  389.  
  390.  
  391. WINDOWS        ENDS
  392.  
  393. SAVEREST    SEGMENT   PARA 
  394. DGROUP        GROUP     DSEG,IDATA,SSEG,ZZMSEG
  395. EGROUP        GROUP     ESEG
  396.         ASSUME    CS:SAVEREST,DS:DGROUP,ES:EGROUP,SS:DGROUP
  397. SAVEREST    ENDS
  398.  
  399. OVERLAY_AREA    SEGMENT    PARA PUBLIC 'CODE'
  400. OVERLAY_AREA    ENDS
  401.  
  402. DSEG        SEGMENT    PARA 
  403. DSEG        ENDS
  404.  
  405. IDATA        SEGMENT COMMON PARA 'DATA'
  406. IDATA        ENDS
  407.  
  408. SSEG        SEGMENT     STACK PARA 'STACK'
  409. SSEG        ENDS
  410.  
  411. ZZMSEG        SEGMENT MEMORY word 'MEMORY'
  412. ZZMSEG        ENDS
  413.  
  414. ESEG        SEGMENT COMMON BYTE 'CCODE'
  415. ESEG        ENDS
  416.  
  417. _PROG       SEGMENT   PARA 
  418.         PUBLIC      SAVRST
  419.         ASSUME    CS:_PROG,DS:_PROG
  420. _PROG        ENDS
  421.  
  422.  
  423.  
  424.  
  425.  
  426. _PROG        SEGMENT   PARA 
  427.         PUBLIC      SAVRST
  428.         ASSUME    CS:_PROG,DS:_PROG
  429. VIDEOMODE        DB    0FFH
  430. CURPAGE            DB    0
  431. CURSORPOS        DW    0
  432. SCREEN_SAVE_AREA    LABEL    WORD
  433. SCREEN_SAVE_AREA_1    DW    BYTES_IN_VIDEO_MEMORY DUP(0)
  434.  
  435.  
  436. ;***************************************************************************
  437. ;*                                                                         *;
  438. ;* called as:                                                              *;
  439. ;* working-storage section.                                                *;
  440. ;* 01  saverestore.                                                        *;
  441. ;*     03  save         pic x value 'S'.                                   *;
  442. ;*     03  restore      pic x value 'R'.                                   *;
  443. ;*                                                                         *;
  444. ;* call 'savrst' using save | restore.                                     *;
  445. ;*                                                                         *;
  446. ;*                                                                         *;
  447. ;*                                                                         *;
  448. ;***************************************************************************
  449.  
  450.  
  451. SAVRST        PROC        FAR                ;THIS IS USED IN AN EXEC PROGRAM
  452.         PUSH        BP                  ;SAVE THE BP REG                
  453.         MOV        BP,SP               ;MOVE THE SP TO THE BP SO WE CAN GET
  454.         PUSH        AX                ;THE PARMS OFF THE STACK
  455.         PUSH        BX                ;SAVE ALL REGS ON ENTRY
  456.         PUSH        CX                ;GOOD PRACTICE WHEN INTERFACING TO
  457.         PUSH        DX                ;COBOL VERSION 6.05
  458.         PUSH        DS
  459.         PUSH        ES
  460.         PUSH        SI
  461.         PUSH        DI
  462.         MOV        BX,WORD PTR [BP+CHAR_PARM]    ;GET ADDRESS OF FIRST PARAMETER
  463.         MOV        AX,WORD PTR [BX]                ;LOAD AX WITH VALUE POINTED TO BY BX 
  464.         AND        AL,05FH                ;MAKE SURE ITS IN CAPS                 
  465.         CLD                                    ;CLEAR DIRECTING FLAG
  466.         CMP        AL,SAVE                ;IS IT A SAVE
  467.         JZ        SAVE_SCREEN            ;YEP
  468.         CMP        AL,RESTORE            ;IS IT A RESTORE
  469.         JZ        RESTORE_SCREEN            ;YEP
  470. EXIT_SRST:    POP        DI                ;PREPAIR TO EXIT
  471.         POP        SI
  472.         POP        ES
  473.         POP        DS
  474.         POP        DX
  475.         POP        CX
  476.         POP        BX
  477.         POP        AX
  478.         POP        BP
  479.         RET        2                          ;WE RET 2 AS WE PASSED A CHAR TO THE ROUTINE
  480. SAVE_SCREEN:    XOR        AL,AL                       ;ZERO OUT AL REG
  481.         MOV        AH,0FH                      ;GET CURRENT VID MODE
  482.         INT        10                          ;THROUGH A VID BIOS CALL
  483.         MOV        cs:[VIDEOMODE],AL              ;SAVE IT        
  484.         MOV        cs:[CURPAGE],BH              ;AND PAGE        
  485.         XOR        AL,AL                       ;ZERO OUT AL REG
  486.         MOV        AH,03                       ;GET CURSOR POSITION
  487.         INT        10                          ;VIA A VID BIOS CALL
  488.         MOV        cs:[CURSORPOS],DX              ;SAVE ROW COL
  489.         MOV        AX,MONO_DISPLAY_ADDRESS            ;ASSUME THIS IS A MONO DISPLAY
  490.         CMP        BYTE PTR cs:[VIDEOMODE],07        ;CHECK TO MAKE SURE
  491.         JZ        MONO_DISPLAY            ;YEP IT'S MONO
  492.         MOV        AX,COLOR_DISPLAY_ADDRESS    ;NOPE ITS COLOR
  493. MONO_DISPLAY:    MOV        DS,AX                ;SET DS TO BASE OF VID ADDRESS
  494.         MOV        SI,0000                ;SET SI TO 0 FOR COPY
  495.         PUSH        CS                          ;SAVE CS AND ES
  496.         POP        ES                          ; 
  497.         MOV        DI,offset cs:SCREEN_SAVE_AREA        ;SET DESTINATION TO OUR SAVE AREA
  498.         MOV        CX,BYTES_IN_VIDEO_MEMORY        ;SET THE COUNT
  499.         REPZ        MOVSW                        ;STORE IT
  500.         JMP        EXIT_SRST
  501. RESTORE_SCREEN: CMP        BYTE PTR cs:[VIDEOMODE],0FFH    ;SEE IF WE HAVE A SCRN TO RESTORE
  502.         JNZ        VALID_SCREEN                    ;YEP WE DO
  503.         JMP        EXIT_SRST                ;NOPE YOU CALLED THE RESTORE WITHOUT SAVING FIRST
  504. VALID_SCREEN:    MOV        BH,cs:[CURPAGE]            ;GET CURRENT PAGE
  505.         MOV        DX,cs:[CURSORPOS]            ;AND THE CURSOR POS
  506.         XOR        AL,AL                       ;ZERO OUT THE AL
  507.         MOV        AH,02                        ;SET THE CURSOR IN PLACE
  508.         INT        10                          ;VIA A CALL TO VID BIOS
  509.         MOV        AX,MONO_DISPLAY_ADDRESS         ;LOAD THE BASE OF MONO
  510.         CMP        BYTE PTR cs:[VIDEOMODE],07         ;SEE IF WE REALLY ARE MONO
  511.         JZ        RESTORE_MONO                    ;YEP
  512.         MOV        AX,COLOR_DISPLAY_ADDRESS        ;NOPE
  513. RESTORE_MONO:   MOV        ES,AX                       ;LOAD THE ES WITH THE VID BASE
  514.         MOV        DI,0000                     ;LOAD THE DEST WITH 0
  515.         PUSH        CS                         ;PUSH CS
  516.         POP        DS                             ;AND LOAD IT BACK TO THE DS
  517.         MOV        SI,offset cs:SCREEN_SAVE_AREA             ;SET THE SOURCE
  518.         MOV        CX,BYTES_IN_VIDEO_MEMORY    ;AND THE COUNT
  519.         REPZ        MOVSW                         ;NOW DO IT
  520.         JMP        EXIT_SRST
  521. SAVRST        ENDP                                 
  522.  
  523.  
  524.  
  525. _PROG        ENDS
  526.  
  527.  
  528.  
  529.  
  530.  
  531. WINDOWS        SEGMENT   PARA 
  532. DGROUP        GROUP     DSEG,IDATA,SSEG,ZZMSEG
  533. EGROUP        GROUP     ESEG
  534.         ASSUME    CS:WINDOWS,DS:DGROUP,ES:EGROUP,SS:DGROUP
  535. WINDOWS        ENDS
  536. OVERLAY_AREA    SEGMENT    PARA PUBLIC 'CODE'
  537. OVERLAY_AREA    ENDS
  538.  
  539. DSEG        SEGMENT    PARA 
  540. ;
  541. ;
  542. ; DATA STORAGE AND EQUATES USED BY WINDOW
  543. ;
  544. ;
  545.  
  546. VIDEO_ADDRESS        DW    0B800H    ;DEFAULT TO COLOR VIDEO ADDRESS
  547. DBUG_POINT        DB    0    ;HAD A PROBLEM HERE MAY BE REPLACED
  548. CURRENT_VID_MODE    DB    0    ;CURRENT VIDEO MODE
  549.  
  550. VID_TABLE        DB    02CH    ;VALUES TO PROGRAM THE 
  551.             DB    028H    ;VIDEO CONTROLER CHIP
  552.             DB    02DH    ;TO SET SUCH THINGS AS RETRACE ON/OFF
  553.             DB    029H    ;ACCEPT CHAR. ECT..
  554.             DB    02AH    ;
  555.             DB    02EH    ;
  556.             DB    01EH    ;
  557.  
  558. ROW_POINTER        DB    0    ;ROW    FROM COBOL PROGRAM
  559. COLUMN_POINTER        DB    0    ;COLUMN FROM COBOL PROGRAM
  560. WIDTH_POINTER        DB    0    ;WIDTH  FROM COBOL PROGRAM
  561. HEIGHT_POINTER        DB    0    ;HEIGHT FROM COBOL PROGRAM
  562. INCRM_ROW_PNTR        DB    0    ;WHERE WE STORE THE TEMP VALUES
  563. INCRM_COL_PNTR        DB    0    ;
  564. WRITE_CHAR_X_TIMES    DB    0    ;
  565. BYTES_MOVED        DB    0    ;
  566. ATRIBUTE_POINTER    DB    0    ;ATRIBUTE
  567. DURATION        DW    0
  568. TONE            DB    0FFH    ;
  569. SOUND_CONTROL        DB    0
  570.  
  571. DSEG        ENDS
  572. IDATA        SEGMENT COMMON PARA 'DATA'
  573. IDATA        ENDS
  574. SSEG        SEGMENT     STACK PARA 'STACK'
  575. SSEG        ENDS
  576. ZZMSEG        SEGMENT MEMORY word 'MEMORY'
  577. ZZMSEG        ENDS
  578. ESEG        SEGMENT COMMON BYTE 'CCODE'
  579. ESEG        ENDS
  580.         END
  581.  
  582.  
  583.  
  584.  
  585.